﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;

// 运算法重载的本质是另一种函数调用，编译器去调用，这个函数统一的名字叫operator   
class Maker {
public:
	Maker(int id, int age) {
		this->id = id;
		this->age = age;
	}
	void print() {
		cout << "id=" << id << ", age=" << age << endl; 
	}
	// 成员函数方式，只需要一个参数，这个参数是减号的右边 
	Maker * operator-(Maker &m) {
		Maker * m1 = new Maker(id - m.id, age - m.age);
		return m1;
	}
public:
	int id;
	int age;
};

// 全局方式 
// 参数类型为类类型或枚举类型 
// 第一个参数是加号左边的值，第二个参数是加号右边的值 
Maker * operator+(Maker & m1, Maker & m2) {
	Maker * m = new Maker(m1.id + m2.id, m1.age + m2.age); 
	return m;
}

void test01() {
	Maker *m1 = new Maker(1, 10);
	Maker *m2 = new Maker(2, 15);
	/*
	调用*m1 + *m2，编译器会：
	1.全局查找有没有operator+这个函数；
	2.检查该函数参数类型是否对应；
	3.若参数对应，则调用operator+(Maker & m1, Maker & m2)这个函数。
	*/
	Maker *m3 = *m1 + *m2;
	m3->print();
}

void test02() {
	Maker *m1 = new Maker(1, 10);
	Maker *m2 = new Maker(2, 15);
	Maker *m3 = *m2 - *m1;
	m3->print(); 
}

int main()
{

	// test01(); 
	test02(); 

	system("pause");
	return EXIT_SUCCESS;
}